package com.cx330;

import org.junit.Test;

public class Example50 {
    @Test
    public void test1() {
        int a = 1;
        int b = 1;
        System.out.println(a == b); // true 数据值相等
//        System.out.println(a.equals(b)); // 错误
    }

    @Test
    public void test2() {
        String s1 = new String("hello");
        StringBuffer s2 = new StringBuffer("hello");
//        System.out.println(s1 == s2); // 编译报错 s1和s2的类型不一致
        System.out.println(s1.equals(s2)); // false s1和s2的类型不一致
    }

    @Test
    public void test3() {
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2); // true "hello"是字符串常量对象，可以被共享，s1和s2指向同一个"hello"对象，地址值相同
        System.out.println(s1.equals(s2)); // true 地址值相同，equals肯定是true
    }

    @Test
    public void test4() {
        String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1 == s2); // false 地址值不相同
        System.out.println(s1.equals(s2)); // true 重写equals，比较字符串的内容
    }

    @Test
    public void test5() {
        StringBuffer s1 = new StringBuffer("hello");
        StringBuffer s2 = new StringBuffer("hello");
        System.out.println(s1 == s2); // false 地址值不相同
        System.out.println(s1.equals(s2)); // false 没有重写equals，仍然比较地址值
    }

    @Test
    public void test6() {
        String s1 = new String("hello");
        String s2 = null;
        String s3 = null;
        System.out.println(s1 == s2); // false 非null与null不相等
        System.out.println(s2 == s3); // true 两个null值相同
        System.out.println(s1.equals(s2)); // false 非null与null不相等
        System.out.println(s2.equals(s3)); // 空指针异常 s2是null空值，没有指向任何对象
    }

    @Test
    public void test7() {
        int a = 1;
        int b = 1;
        System.out.println(a == b); // true 基本数据类型，比较数据值
        a = 200;
        b = 200;
        System.out.println(a == b); // true 基本数据类型，比较数据值
    }

    @Test
    public void test8() {
        Integer a = 1;
        Integer b = 1;
        System.out.println(a == b); // true 1是常量对象，可以共享，a，b指向同一个Integer对象
        System.out.println(a.equals(b)); // true 重写了equals，比较内容值
        a = 200;
        b = 200;
        System.out.println(a == b); // false 200非常量对象，不可以共享，a，b指向不同Integer对象，地址值不相同
        System.out.println(a.equals(b)); // true 重写了equals，比较内容值
    }

    @Test
    public void test9() {
        Integer a = 1;
        int b = 1;
        System.out.println(a == b); // true 拆箱，按照基本数据类型处理，比较数据值
        System.out.println(a.equals(b)); // true 装箱，按照包装类处理，Integer重写了equals，比较内容值
        a = 200;
        b = 200;
        System.out.println(a == b); // true 拆箱，按照基本数据类型处理，比较数据值
        System.out.println(a.equals(b)); // true 装箱，按照包装类处理，Integer重写了equals，比较内容值
    }

    @Test
    public void test10() {
        Integer a = 1;
        double b = 1.0;
        System.out.println(a == b); // true 拆箱，按照基本数据类型处理，交数据值 int的1和double的1.0，int自动升级为double，比较1.0 == 1.0
        System.out.println(a.equals(b)); // false 装箱，按照包装类处理，Integer对象和Double对象，类型不一致，false
    }

    @Test
    public void test11() {
        Integer a = 1;
        Double b = 1.0;
//        System.out.println(a == b); // 编译报错，==比较两个对象地址时，要求类型相同
        System.out.println(a.equals(b)); // false Integer对象和Double对象，类型不一致
    }
}
